当前位置:flash课件吧→免费FLASH教程之三(含实例教程)新页面 新改版 新气象

题 目:Flash中简单跟踪弹的算法

我看到的一些作跟踪弹的方法,都是要用向限的转换,还要考虑子弹和飞机在某个方向保持平行时做一些调整,个人认为有些烦。而我这个用方向向量来计算跟踪弹的方式,无论坐标系如何变,相关的计算只有一个,把速度在X,Y方向的“单位方向向量”计算出来,即可。 学过向量的朋友应该都知道,单位方向向量(x,y),其中的X就是这个向量和X轴的夹角的余弦值,而Y就是正弦值,还等什么,马上行动。 核心代码如下:

  function Getdistance(mc1, mc2) {//计算了出二者―――子弹和我机的距离

  return Math.sqrt((mc1._x-mc2._x)*(mc1._x-mc2._x) (mc1._y-mc2._y)*(mc1._y-mc2._y));

  }

  function StardandlizeAngle(mc1, mc2) {//计算出子弹速度的方向向量。

  var l = Getdistance(mc1, mc2);

  mc1.VdirectionX=(mc2._x-mc1._x)/l;//单位方向向量中的X mc1.VdirectionY=(mc2._y-mc1._y)/l;//单位方向向量中的Y

  }

  function doMove(mc){//算出VX,VY,通过mc._x =mc.vx //及mc._y =mc.vy;实现动态效果

  mc.vx=mc.v*mc.VdirectionX;

  mc.vy=mc.v*mc.VdirectionY;

  mc._x =mc.vx;

  mc._y =mc.vy;

  } _root.onEnterFrame=function(){

  StardandlizeAngle(bullet,plane);

  doMove(bullet);

  }

  PS:其中对象的属性我是另个在一段AS脚本中用mc.prototype.属性(方法)=function(){[ } 个人比较喜欢用这种方式,尤其是一些物理属性频烦使用时,这就好比是个小的物理属性库了,很的方便。

 

 

 

图片转换AS2.0类(实用型)

AS类代码:

  
import mx.events.EventDispatcher;

  class ShowImages extends MovieClip {

  private var myUrl:Array; //存放图片路径的数组

  private var myInfo:Array; //存放图片信息的数组

  private var showImageBox:MovieClip; //图片显示区域

  private var myLoading:MovieClip //加载图片的MC

  private var topMC:MovieClip; //顶部MC

  private var buttonMC:MovieClip; //底部MC

  private var currentTopMC:MovieClip; //记录当前在较高深度的MC

  private var allowToPlayImage:Boolean = true;

  private var _id:Number; //定时器ID

  private var _showtime:Number = 3000; //定时器时长

  private var imageID:Number = 0; //自动播放时保存图片ID值

  private var myMask:MovieClip; //遮罩MC

  private var ImageDepth:Number=100; //放置图片MC的深度

  private var firstLoadImage:Boolean = true; //是否第一次载入图片

  //private static var loaderTextFormat:TextFormat = new TextFormat("Arial", null, 0x000000, true);

  public var addEventListener:Function;

  public var removeEventListener:Function;

  private var dispatchEvent:Function;

  private static var _mixin1 = EventDispatcher.initialize(ShowImages.prototype);

  public function ShowImages() {

  fscommand("allowscale",false);

  fscommand("showmenu",false);

  }

  private function onLoad():Void {

  //定位至原点

  _x = _y = 0;

  //添加侦听事件

  addEventListener("onPhotoListLoad", this);

  //导入存放图片的XML文档

  myUrl = new Array();

  //myInfo = new Array();

  var me:Object = this;

  var my_xml = new XML();

  my_xml.ignoreWhite = true;

  my_xml.load("PhotoList.xml");

  my_xml.onLoad=function(success){

  if (success){

  //数组值添加

  var xmlA:Array = this.firstChild.childNodes;

  var xmlALen:Number = xmlA.length;

  for (var i = 0; i<xmlALen; i ) {

  me.myUrl.push(xmlA[i].attributes.myUrl);

  //me.myInfo.push(xmlA[i].attributes.myInfo);

  }

  //发出事件给自身

  me.dispatchEvent({type:"onPhotoListLoad", target:this});

  }

  }

  }

  private function onPhotoListLoad():Void {

  //先建立放图片的的MC

  showImageBox = this.createEmptyMovieClip("showImageBox",ImageDepth);

  myLoading = showImageBox.createEmptyMovieClip("myLoading",ImageDepth 20);

  topMC = showImageBox.createEmptyMovieClip("topMC", ImageDepth 10);

  //topMC._x = 200;

  buttonMC = showImageBox.createEmptyMovieClip("buttonMC", ImageDepth);

  //导入图片(loadImage是自循环式函数)

  loadImage();

  }

  private function loadImage():Void {

  //先取消定时器

  clearInterval(_id);

  //取得对象自身,方便访问

  var thisObject:Object = this;

  //循环控制(这里使用变换深度然后配置遮罩的方法)

  if ( imageID == myUrl.length ) imageID = 0;

  //第一次载入图片时无需交换深度

  if (firstLoadImage){

  currentTopMC = topMC;

  firstLoadImage = false;

  }else{

  //先交换深度

  topMC.swapDepths(buttonMC);

  //再决定谁在上面

  if ( topMC.getDepth() > buttonMC.getDepth() ){

  currentTopMC = topMC;

  }else{

  currentTopMC = buttonMC;

  }

  }

  //在上面的MC导入图片,因为遮罩只对处在上面的MC

  currentTopMC.loadMovie(myUrl[imageID]);

  //trace(topMC.getDepth());

  imageID ;

  //导入图片

  myLoading.onEnterFrame = function() {

  var lb:Number = thisObject.currentTopMC.getBytesLoaded();

  var tb:Number = thisObject.currentTopMC.getBytesTotal();

  var percent:Number = Math.round(lb/tb*100);

  if (percent == 100 and thisObject.currentTopMC.getBytesLoaded()>100 and thisObject.currentTopMC._height>0){

  //特效显示图片

  thisObject.showOff(thisObject.currentTopMC);

//调用定时器控制图片showOff时间

  thisObject._id = setInterval(thisObject,"loadImage", thisObject._showtime);

  //取消onEnterFrame

  delete this.onEnterFrame;

  }

  }

  }

  private function showOff(mc:MovieClip):Void {

  myMask = showImageBox.createEmptyMovieClip("myMask",ImageDepth 30);

  //随机给出遮罩方法(这个随机数的范围自己给出,大小为任何的方法数量和,我这里给了5种最基本的方法,读者可自行增加)

  var myRnd:Number = random(5);

  eval("showOff_" myRnd)(myMask);

  //showOff_4(myMask);

  //速度控制

  var v:Number = 10;

  //----------------------------------------------------------------

  //方法一(左上至右下)

  function showOff_0(mc:MovieClip){

  drawRectangleAt(mc);

  mc.onEnterFrame = function(){

  if (_width >= Stage.width and _height >= Stage.height ) delete this.onEnterFrame;

  _width = v;

  _height = v;

  }

  }

  //方法二(左至右)

  function showOff_1(mc:MovieClip){

  drawRectangleAt(mc);

  mc._height = Stage.height;

  mc.onEnterFrame = function(){

  if (_width >= Stage.width) delete this.onEnterFrame;

  _width = v;

  }

  }

  //方法三(上至下)

  function showOff_2(mc:MovieClip){

  drawRectangleAt(mc);

  mc._width = Stage.width;

  mc.onEnterFrame = function(){

  if (_height >= Stage.height) delete this.onEnterFrame;

  _height = v;

  }

  }

  //方法四(下至上)

  function showOff_3(mc:MovieClip){

  drawRectangleAt(mc);

  mc._y = Stage.height;

  mc._width = Stage.width;

  mc.onEnterFrame = function(){

  if (_height >= Stage.height) delete this.onEnterFrame;

  _height = v;

  _y -= v;

  }

  }

  //方法五(右至左)

  function showOff_4(mc:MovieClip){

  drawRectangleAt(mc);

  mc._x = Stage.width;

  mc._height = Stage.height;

  mc.onEnterFrame = function(){

  if (_width >= Stage.width) delete this.onEnterFrame;

  _width = v;

  _x -= v;

  }

  }

  //--------------------------------------------------------------------------

  //函数:画一个矩形,用来进行遮罩时的变形(当然您也能够用attachMovie从库里添加,这样您就能够做各种各样的形状。

  //我在这个例子中强调的是脚本)

  function drawRectangleAt(mc:MovieClip){

  with (mc){

  lineStyle( 0, 0xffffff, 100 );

  beginFill(0xffffff);

  moveTo( 0, 0 );

  lineTo( 0, 10 );

  lineTo( 10, 10 );

  lineTo( 10, 0 );

  lineTo( 0, 0 );

  endFill();

  }

  }

  //配置遮罩

  //trace(mc);

  mc.setMask(myMask);

  }

  //setter方法

  public function set showtime(i:Number):Void {

  _showtime = i;

  }

  }

 

 

 

6步构造充满动感的角色

 STEP 1 让我们先从动作线开始。线条要随意、松散,这样才能更好的表现动作和姿势的感觉。

  动作线应该灵活,要避免画直线--那样会使您的角色显得很死板,像木头人相同。

  提示:画的时候应该运动整个胳膊,而不但仅是手腕。

  

  

  STEP 2

  在动作线上面添加一些简单的图像。在添加的时候要从三维的角度考虑,像图2那样。

  提示:轴线对增加您的三维感觉很有帮助。

  

  3.用线把身体的形状描述出来,一般情况下,我们都会使用圆筒形状。

  

  04:圆筒的形状能够是多样的,我们能够尝试不同形状的圆筒,来达到更多有趣的效果。

  

  

  05

  

  

  

  STEP 5

  下面要弄清楚脸的方向。

  

  

  提示:脖子要一直在身体的前面部分,而且不要放在肩膀上(图5a)。

  

  STEP 6

  最后,把衣服挂在身体上,这是画角色的最后一步。

  

  提示:线条要圆滑、松散,这样会使得您的角色充满动感。

 

 

 

 

 

 

 

期刊论文服务

合作期刊
学报期刊
 
获奖证书办理
本站已改版成新站 课件115学培吧http://www.kj115.com
免费FLASH教程之三(含实例教程)内容导航
为Flash建搜索内容索引 Flash广告播放器研发 Flash引领互动动画潮流 Flash趣味鼠标特效大作战
Flash MX 2004滚动文本框的两种做法 给Flash文件添加历史记录 Flash中的常见术语(详解) 用笛卡尔公式画出的一颗心状图
播放器拖动进度条制作 水滴效果动画,Flash制作中的AS问题 中秋寄相思 自制Flash贺卡 用SWiSHmax轻松制作精彩Flash片头
用autocad制作一个量角器_autocad教程 Flash百叶窗制作教程 Flash制作实用别致的导航菜单 Flash实用技巧之音乐时间显示篇
Flash中的电影艺术之镜头技巧教程
Flash AS游戏教程:人物及控制 PS+FLASH制作马赛克效果 如何在论坛中,链接自已的FLASH动画呢!
FLASH中的抛运动中的竖直上抛运动 鼠标感应花儿转动效果 FLASH效果篇:闪光效果 自己动手制作手机Flash主题动画
晨雾蒙蒙动画效果,Flash制作方法 Flash制作简单MP3播放器 Flash制作滚动广告图片效果 Flash MX动画制作实例教程-文字处理-设置段落属性
电闪雷鸣、小雨纷飞的效果,Flash制作方法 Flash实现用鼠标调整窗口的大小 AS3学习源码--打气球 关于主动画中load动画和动态文本的共同运用问题
关于倒计时程序的准确性解决方法之一 Flash加载外部文件的方法与技巧集合 Tween类:图片缓动浏览效果 FLASH中加载外部音乐代码&部分难找AS教程
Flash与Java Servlet结合实现网上对战 用AS3实再FLASH游戏的上下左右移动 FLASH中加载外部音乐代码 Flash动态文本框中加载HTML格式文本
Flash制作环绕的立体图片效果动画 FLASH CS3中的FLA形式组件制作教程 酷!Flash聊天室的实现 更多相关内容总目录(200个)》》》
国家信息产业部备案专号:鄂ICP08005724返回顶部
本站推荐最佳分辨率:1024X768在线咨询台
声明:我站除课件制作动画制作培训以外,所有内容均属于免费资源。本站部分资源来自于网络,由本站收集整理,如有侵权请联系本站管理(QQ444860709 手机13339817386),我站会在三个工作日内处理。